/******************************************************************************
 *
 * @file       player.h
 * @brief      玩家类; robot.h 和 userplayer.h 都是继承当前 player.h 的哦
 *
 * @author     ax
 * @date       2024/05/21
 * @history
 *****************************************************************************/

#ifndef PLAYER_H
#define PLAYER_H

#include <QObject>
#include "cards.h"

class Player : public QObject
{
    Q_OBJECT
public:
    enum Role{Lord, Farmer};    // 角色
    enum Sex{Man, Woman};       // 性别
    enum Direction{Left, Right};    // 头像的显示方位
    enum Type{Robot, User, UnKnow}; // 玩家的类型
    explicit Player(QObject *parent = nullptr);
    explicit Player(QString name, QObject *parent = nullptr);

    void setName(QString name);
    QString getName();

    void setRole(Role role);
    Role getRole();

    void setSex(Sex sex);
    Sex getSex();

    void setDirection(Direction direction);
    Direction getDirection();

    void setType(Type type);
    Type getType();

    void setScore(int score);
    int getScore();

    void setWin(bool flag);
    bool isWin();

    //
    void setPrevPlayer(Player* player);
    void setNextPlayer(Player* player);
    Player* getPrevPlayer();
    Player* getNextPlayer();

    void grabLordBet(int point); // 游戏开始时候的叫地主 / 抢地主，下注几点？

    // 存储卡牌，发的时候得到的
    void storeDispatchCard(const Card& card);
    void storeDispatchCard(const Cards& cards);

    Cards getCards(); // 玩家得到所有的卡牌
    void clearCards(); // 清空玩家的所有卡牌
    void playHand(const Cards& cards); // 玩家出牌（单张 / 多张，就需要 remove 手中的卡牌）

    Player* getPendPlayer(); // 打出的卡牌是谁打出的
    Cards getPendCards(); // 获取到打出的卡牌玩家
    void storePendingInfo(Player* player, const Cards& cards); // 存储打出卡牌的信息（Cards 和 Player）

    virtual void prepareCallLord();
    virtual void preparePlayHand();
    virtual void thinkCallLord();
    virtual void thinkPlayHand();

signals:
    void notifyGrabLordBet(Player* player, int bet);
    void notifyPlayHand(Player* player, const Cards& card);
    void notifyPickCards(Player* player, const Cards& cards);

protected:
    int m_score = 0;
    QString m_name;
    Role m_role;
    Sex m_sex;
    Direction m_direction; // 玩家头像脸的朝向
    Type m_type;

    bool m_isWin = false;
    Player* m_prev = nullptr; // 当前玩家的上一个玩家
    Player* m_next = nullptr; // 当前玩家的下一个玩家
    Cards m_cards;

    Cards m_pendCards; // 桌面上打出的卡牌（得判断打出的卡牌是否是自己打出的）
    Player* m_pendPlayer = nullptr; // 桌面上打出的卡牌是哪个玩家
};

#endif // PLAYER_H
